#include "Dispatcher.h"
#include <algorithm>

namespace ComputingObjects
{

Dispatcher::Dispatcher(ProcessingUnit& processor)
: myProcessor(processor)
{
}

Dispatcher::~Dispatcher()
{
}


void Dispatcher::addWorkUnit(SharedWorkUnit work)
{
	myDispatchQueue.push_back(work);
}


void Dispatcher::notifyDispatch(SharedWorkUnit unit)
{
	std::list<DispatchObserver*>::iterator anIT = myObservers.begin();
	while (anIT != myObservers.end()) {
		(*anIT)->notifyDispatch(unit);
		++anIT;
	}
}

void Dispatcher::addObserver(DispatchObserver* anObserver)
{
	myObservers.push_back(anObserver);
}

void Dispatcher::removeObserver(DispatchObserver* anObserver)
{
	myObservers.remove(anObserver);
}

/*
 * Observer methods
 */

DispatchObserver::DispatchObserver(Dispatcher& dispatcher)
	: myDispatcher(dispatcher)
{
	dispatcher.addObserver(this);
}


DispatchObserver::~DispatchObserver()
{
	myDispatcher.removeObserver(this);
}


}
